# $@  表示目标文件
# $^  表示所有的依赖文件
# $<  表示第一个依赖文件
# $?  表示比目标还要新的依赖文件列表

CROSS =

CC = $(CROSS)gcc
CXX = $(CROSS)g++

RM = rm -rf

CFLAGS =  -Wall  -g -std=c++11  #表示用于 C 编译器的选项
CXXFLAGS= -Wall -g -std=c++11   #用于 C++ 编译器的选项

LDFLAGS=    #指定库文件的位置
LIBS= -lpthread      #链接哪些库文件


TOP_PATH = $(shell pwd)
SRC_PATH = ./   #当前目录
MOD_PATH = $(TOP_PATH)/test
MOD_LIB_PATH = $(MOD_PATH)/lib
MOD_INC_PATH = $(MOD_PATH)/include



DIRS = $(shell find $(SRC_PATH) -maxdepth 3 -type d)   #当前目录下的目录
DIRS +=./

SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp)) 
SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))
SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))


OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))
OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC)) 
OBJS_C = $(patsubst %.c, %.o, $(SRCS_C)) 


#目标
TARGET := main

all:$(TARGET)



$(TARGET) : $(OBJS_CPP) $(OBJS_CC) $(OBJS_C)
	@ for i in $(MODULES_PATH); \
    do \
		make -C $$i; \
    done
	@ $(CXX) $^ -o $@ $(LIB_PATH) $(LIBS)
	@ echo Create $(TARGET) ok... 

$(OBJS_CPP):%.o : %.cpp
	$(CXX) -c $(CFLAGS) $< -o $@ 

$(OBJS_CC):%.o : %.cc  
	$(CXX) -c $(CFLAGS) $< -o $@ 
          
$(OBJS_C):%.o : %.c  
	$(CXX) -c $(CFLAGS) $< -o $@ 



.PHONY : clean
clean:
	@ $(RM) $(TARGET) $(OBJS_CPP) $(OBJS_CC) $(OBJS_C)
	@ for i in $(MODULES_PATH); \
	do \
		make clean -C $$i; \
    done
	@echo clean all... 
